/**
 * The contents of this file are subject to the Mozilla Public License Version 1.1
 * (the "License"); you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at http://www.mozilla.org/MPL/
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for the
 * specific language governing rights and limitations under the License.
 *
 * The Original Code is "ExampleReceiverApplication.java".  Description:
 * "Example Code"
 *
 * The Initial Developer of the Original Code is University Health Network. Copyright (C)
 * 2001.  All Rights Reserved.
 *
 * Contributor(s): James Agnew
 *
 * Alternatively, the contents of this file may be used under the terms of the
 * GNU General Public License (the  �GPL�), in which case the provisions of the GPL are
 * applicable instead of those above.  If you wish to allow use of your version of this
 * file only under the terms of the GPL and not to allow others to use your version
 * of this file under the MPL, indicate your decision by deleting  the provisions above
 * and replace  them with the notice and other provisions required by the GPL License.
 * If you do not delete the provisions above, a recipient may use your version of
 * this file under either the MPL or the GPL.
 *
 */
package hapiserverproject;

import java.io.IOException;

import javax.swing.JTextArea;

import ca.uhn.hl7v2.HL7Exception;
import ca.uhn.hl7v2.app.Application;
import ca.uhn.hl7v2.app.ApplicationException;
import ca.uhn.hl7v2.app.DefaultApplication;
import ca.uhn.hl7v2.conf.ProfileException;
import ca.uhn.hl7v2.conf.check.DefaultValidator;
import ca.uhn.hl7v2.conf.parser.ProfileParser;
import ca.uhn.hl7v2.conf.spec.RuntimeProfile;
import ca.uhn.hl7v2.model.Message;
import ca.uhn.hl7v2.model.v231.message.ACK;
import ca.uhn.hl7v2.model.v231.segment.MSH;
import ca.uhn.hl7v2.parser.PipeParser;


/**
 * Application class for receiving ADT^A01 messages
 */
public class ExampleReceiverApplication implements Application
{

    private String output = new String();
    private JTextArea textArea;
    
	public void receiveTextToReceiver(JTextArea theTextArea)	{
		this.textArea = theTextArea;
	}

	public String getOutput() {
		return output;
	}


	public void setOutput(String output) {
		// this.output = output.concat(output);
		//System.out.println(output);
		textArea.append(output);

	}
	
	/**
     * {@inheritDoc}
     */
    public boolean canProcess(Message theIn) {
        return true;
    }


    /**
     * {@inheritDoc}
     */
    public Message processMessage(Message theIn) throws ApplicationException, HL7Exception {

        String encodedMessage = new PipeParser().encode(theIn);
        System.out.println(encodedMessage.contains("\r"));
        encodedMessage = encodedMessage.replace("\r", "\r\n");
        System.out.println("Received message:\n" + encodedMessage + "\n\n");
        setOutput ("\n\n\n" +("Received message:\n" + encodedMessage));
        
//        textArea.setText("Received message:\n" + encodedMessage + "\n\n");

        
        
        Message parsedMessage = new PipeParser().parse(encodedMessage);

        // Load a conformance profile
        ProfileParser profileParser = new ProfileParser(false);
        RuntimeProfile profile = null;
        try {
            profile = profileParser.parseClasspath("resources/ca/uhn/hl7v2/examples/profiles/ADT_A05.xml");
        } catch (ProfileException e1) {
            e1.printStackTrace();
            setOutput ("\n" +(e1.toString()) + (e1.getMessage()));
                StackTraceElement [] sarr = e1.getStackTrace(); 
			for (StackTraceElement se : sarr) {
                    setOutput ("\n" +(se.toString()) + (e1.getMessage()));
                }

           
//            textArea.setText("\n" +(e1.toString()) + (e1.getMessage()));
        } catch (IOException e1) {
            e1.printStackTrace();
            setOutput ("\n" + e1.toString());
            StackTraceElement [] sarr = e1.getStackTrace();   
            for(StackTraceElement se : sarr){
                setOutput ("\n" +(se.toString()) + (e1.getMessage()));
            }
//            textArea.setText("\n" +(e1.toString()) + (e1.getMessage()));
        }

        // Create a conformance validator, and validate
        DefaultValidator validator = new DefaultValidator();
        HL7Exception[] exceptions = null;
        try {
            exceptions = validator.validate(parsedMessage, profile.getMessage());
        } catch (ProfileException e1) {
            e1.printStackTrace();
            StackTraceElement [] sarr = e1.getStackTrace();
            
            for(StackTraceElement se : sarr){

                setOutput ("\n" +(se.toString()) + (e1.getMessage()));
            }
//            textArea.setText("\n" +(e1.toString()));
        }
        
        System.out.println("Found " + exceptions.length + " problems");
        setOutput ("\n" +("Found " + exceptions.length + " problems"));
        
//        textArea.setText("\n" +("Found " + exceptions.length + " problems"));
        for (int i = 0; i < exceptions.length; i++) {
            HL7Exception exception = exceptions[i];
            System.out.println(" * " + exception.getClass().getSimpleName() + " - " + exception.getMessage());
            setOutput ("\n" +(" * " + exception.getClass().getSimpleName() + " - " + exception.getMessage()));
//            textArea.setText("\n" +(" * " + exception.getClass().getSimpleName() + " - " + exception.getMessage()));
        }
        

        // Now we need to generate a message to return. This will generally be an ACK message.
        MSH msh = (MSH)theIn.get("MSH");
        ACK retVal;
        try {
            // This method takes in the MSH segment of an incoming message, and generates an
            // appropriate ACK
            retVal = (ACK)DefaultApplication.makeACK(msh);
        } catch (IOException e) {
            StackTraceElement [] sarr = e.getStackTrace();
            
            for(StackTraceElement se : sarr){

                setOutput ("\n" +(se.toString()) + (e.getMessage()));
            }
//        	textArea.setText("\n" +(e.toString()));
            throw new HL7Exception(e);
            
        }

        return retVal;
    }
    
}